package br.uneb.tebd.model;

import java.util.HashMap;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.Context;
import android.content.UriMatcher;
import android.net.Uri;
import android.provider.BaseColumns;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;

public class GuitarProvider extends ContentProvider {

	// Authority do nosso provider, a ser usado nas Uris.
	public static final String AUTHORITY = "br.uneb.tebd.model.guitarprovider";

	// Nome do arquivo que irá conter o banco de dados.
	private static final String DATABASE_NAME = "guitarP.db";

	// Versao do banco de dados.
	// Este valor é importante pois é usado em futuros updates do DB.
	private static final int DATABASE_VERSION = 1;

	// Nome da tabela que irá conter as anotações.
	private static final String GUITARS_TABLE = "guitars";

	// 'Id' da Uri referente às notas do usuário.
	private static final int GUITARS = 1;

	// Tag usada para imprimir os logs.
	public static final String TAG = "GuitarProvider";

	// Instância da classe utilitária
	private DBHelper mHelper;

	// Uri matcher - usado para extrair informações das Uris
	private static final UriMatcher mMatcher;

	private static HashMap<String, String> mProjection;

	static {
		mProjection = new HashMap<String, String>();
		mProjection.put(Guitars.GUITAR_ID, Guitars.GUITAR_ID);
		mProjection.put(Guitars.DESCRIPTION, Guitars.DESCRIPTION);
	}

	static {
		mMatcher = new UriMatcher(UriMatcher.NO_MATCH);
		mMatcher.addURI(AUTHORITY, GUITARS_TABLE, GUITARS);
	}

	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		SQLiteDatabase db = mHelper.getWritableDatabase();
		int count;
		switch (mMatcher.match(uri)) {
		case GUITARS:
			count = db.delete(GUITARS_TABLE, selection, selectionArgs);
			break;
		default:
			throw new IllegalArgumentException("URI desconhecida " + uri);
		}

		getContext().getContentResolver().notifyChange(uri, null);
		return count;
	}

	@Override
	public String getType(Uri uri) {
		switch (mMatcher.match(uri)) {
		case GUITARS:
			return Guitars.CONTENT_TYPE;
		default:
			throw new IllegalArgumentException("URI desconhecida " + uri);
		}
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
		switch (mMatcher.match(uri)) {
		case GUITARS:
			SQLiteDatabase db = mHelper.getWritableDatabase();
			long rowId = db.insert(GUITARS_TABLE, Guitars.DESCRIPTION, values);
			if (rowId > 0) {
				Uri noteUri = ContentUris.withAppendedId(Guitars.CONTENT_URI,
						rowId);
				getContext().getContentResolver().notifyChange(noteUri, null);
				return noteUri;
			}
		default:
			throw new IllegalArgumentException("URI desconhecida " + uri);
		}
	}

	@Override
	public boolean onCreate() {
		mHelper = new DBHelper(getContext());
		return true;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		// Aqui usaremos o SQLiteQueryBuilder para construir
		// a query que ser� feito ao DB, retornando um cursor
		// que enviaremos � aplica��o.
		SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
		SQLiteDatabase database = mHelper.getReadableDatabase();
		Cursor cursor;
		switch (mMatcher.match(uri)) {
		case GUITARS:
			// O Builer receber� dois parametros: a tabela
			// onde ser� feita a busca, e uma projection -
			// que nada mais � que uma HashMap com os campos
			// que queremos recuperar do banco de dados.
			builder.setTables(GUITARS_TABLE);
			builder.setProjectionMap(mProjection);
			break;

		default:
			throw new IllegalArgumentException("URI desconhecida " + uri);
		}

		cursor = builder.query(database, projection, selection, selectionArgs,
				null, null, sortOrder);

		cursor.setNotificationUri(getContext().getContentResolver(), uri);
		return cursor;
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection,  
            String[] selectionArgs) {
		SQLiteDatabase db = mHelper.getWritableDatabase();
		int count;
		switch (mMatcher.match(uri)) {
		case GUITARS:
			count = db.update(GUITARS_TABLE, values, selection, selectionArgs);
			break;
		default:
			throw new IllegalArgumentException("URI desconhecida " + uri);
		}

		getContext().getContentResolver().notifyChange(uri, null);
		return count;
	}

	public static final class Guitars implements BaseColumns {
		
		public static final Uri CONTENT_URI = Uri.parse("content://"
				+ GuitarProvider.AUTHORITY + "/guitars");

		public static final String CONTENT_TYPE = "vnd.android.cursor.dir/"
				+ GuitarProvider.AUTHORITY;

		public static final String GUITAR_ID = "_id";

		public static final String DESCRIPTION = "description";

	} 
	
	public static class DBHelper extends SQLiteOpenHelper {

		DBHelper(Context context) {  
	        super(context, DATABASE_NAME, null, DATABASE_VERSION);  
	    }  

	    /* O m�todo onCreate � chamado quando o provider � executado pela 
	     * primeira vez, e usado para criar as tabelas no database 
	     */  
	    @Override  
	    public void onCreate(SQLiteDatabase db) {  
	        db.execSQL("CREATE TABLE " + GUITARS_TABLE + " (" +  
	                Guitars.GUITAR_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +  
	                Guitars.DESCRIPTION + " LONGTEXT" + ");");  
	    }  

	    /* O m�todo onUpdate � invocado quando a vers�o do banco de dados 
	     * muda. Assim, � usado para fazer adequa��es para a aplica��o 
	     * funcionar corretamente. 
	     */  
	    @Override  
	    public void onUpgrade(SQLiteDatabase db,  
	                                  int oldVersion, int newVersion) {  
	        // Como ainda estamos na primeira vers�o do DB,  
	        // n�o precisamos nos preocupar com o update agora.  
	    }  
	} 
	
}
